/** @file 
 *  File per l'inizializzazione delle funzioni di allegro e delle strutture e la configurazione di alcuni parametri. 
 */

#include <iostream>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include "strutt_dati.h"
using namespace std;

/** Definizione utile per il debug */
#ifdef DEBUG_MODE
#define DBG(a) {a;}
#else 
#define DBG(a)
#endif

void inizzSfondo(sfondo &SFONDO)
{
	SFONDO.immagine = al_load_bitmap("sfondoluci.jpg");
	SFONDO.larghezza=al_get_bitmap_width(SFONDO.immagine); 	
	SFONDO.x = 0;
	SFONDO.y = 0;
	SFONDO.velx = 1;
	SFONDO.sorgX = 0;
}

void inizzGiocatore(giocatore &GIOCATORE, bool gameover)
{
	GIOCATORE.immagine = al_load_bitmap("brask.png");
	GIOCATORE.esplosione = al_load_bitmap("esplosione.png");
	GIOCATORE.larghezza=al_get_bitmap_width(GIOCATORE.immagine)/6; // Larghezza dello sprite/numero di colonne dello spritesheet
	GIOCATORE.altezza=al_get_bitmap_height(GIOCATORE.immagine)/4; // Altezza dello sprite/numero di righe dello spritesheet
	
	GIOCATORE.x = 100;
	GIOCATORE.y = HDisplay-GIOCATORE.altezza;
	GIOCATORE.vely = 0;
	GIOCATORE.sorgX = 0;
	GIOCATORE.sorgY = 0;
	GIOCATORE.salto = false;
	GIOCATORE.morto = false;
	GIOCATORE.punti = 0;
	
	if (gameover==true)
		GIOCATORE.vite = 4;
}

void inizzCattivi(cattivi *CATTIVI, const int ncattivi)
{ 
	srand(time(0));
	CATTIVI[0].x=800;
	
	for(int numcattivo=0; numcattivo<ncattivi; numcattivo++)
	{
		int i=rand()%3; //3 velocità e posizioni
		
		if (numcattivo!=ncattivi-1)
			CATTIVI[numcattivo].immagine=al_load_bitmap("missile.png");	
		else
			CATTIVI[numcattivo].immagine=al_load_bitmap("sara.png");
			
		CATTIVI[numcattivo].larghezza=al_get_bitmap_width(CATTIVI[numcattivo].immagine);
		CATTIVI[numcattivo].altezza=al_get_bitmap_height(CATTIVI[numcattivo].immagine);
		CATTIVI[numcattivo].velx=5;
		
		//aumento la probabilità che il cattivo sia posizionato in basso, l'ultimo "cattivo" è Sara,
		//la cui immagine deve per forza stare in basso e il primo cattivo lo voglio posizionare in basso per far saltare il giocatore.
		if (i==0 || (numcattivo%4==0) || numcattivo==ncattivi-1 || numcattivo==0) 
			CATTIVI[numcattivo].y=HDisplay-CATTIVI[numcattivo].altezza; 
		else if (i==1)
			CATTIVI[numcattivo].y=0;
		else
			CATTIVI[numcattivo].y=HDisplay/2;
		
		if (numcattivo == ncattivi-1)
			CATTIVI[numcattivo].x=CATTIVI[numcattivo-1].x+700;
		else if (numcattivo != 0)	
			CATTIVI[numcattivo].x=CATTIVI[numcattivo-1].x+400;

		DBG(cout<<"Valore di numcattivo: "<<numcattivo<<", immagine: "<<i<<endl);
		DBG(cout<<"x: "<<CATTIVI[numcattivo].x<<", y: "<<CATTIVI[numcattivo].y<<endl);
	}
}
				
bool inizializza()
{

	if(!al_init())
	{
		al_show_native_message_box(NULL, "Attenzione!", "Errore", "Impossibile inizializzare allegro", NULL, ALLEGRO_MESSAGEBOX_ERROR);
		return 0;
	}
	
	if(!al_init_image_addon())
	{
		al_show_native_message_box(NULL, "Attenzione!", "Errore", "Impossibile inizializzare allegro (immagini)", NULL, ALLEGRO_MESSAGEBOX_ERROR);
		return 0;
	}
		
	al_init_font_addon();
	al_init_ttf_addon();


	if (!al_install_keyboard()) 
	{
		al_show_native_message_box(NULL, "Attenzione!", "Errore", "Impossibile installare la tastiera", NULL, ALLEGRO_MESSAGEBOX_WARN);
		return 0;
	}

	if (!al_install_mouse()) 
	{
		al_show_native_message_box(NULL, "Attenzione!", "Errore", "Impossibile installare il mouse", NULL, ALLEGRO_MESSAGEBOX_WARN);
		return 0;
	}

	return 1;
}

void configura(ALLEGRO_DISPLAY *display, ALLEGRO_EVENT_QUEUE *CodaEventi, ALLEGRO_TIMER *timer, ALLEGRO_TIMER *giocatoreTimer) 
{

	al_set_window_title(display, "The City Runner");
	al_set_window_position(display, 0, 0);

	//registrano gli eventi di timer, display e tastiera
	al_register_event_source(CodaEventi, al_get_timer_event_source(timer));
	al_register_event_source(CodaEventi, al_get_timer_event_source(giocatoreTimer));
	al_register_event_source(CodaEventi, al_get_display_event_source(display)); 
	al_register_event_source(CodaEventi, al_get_keyboard_event_source());
	
	al_start_timer(timer);
	al_start_timer(giocatoreTimer);
}
